home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / MPSRC045.LZH / ADP_LOW.HAS < prev    next >
Text File  |  1996-11-18  |  5KB  |  183 lines

  1. *=======================================================
  2. *
  3. *    ADPCM->PCM 低音程変換
  4. *
  5. *=======================================================
  6.  
  7. AtoP_low:
  8.         move.w        CH_PITCH+2(a5),d3    * d3.w = ADPCM音程下位16bit
  9.         move.w        CH_VOL(a5),d5        * d5.w = ADPCM VOLUME
  10.  
  11.         tst.b        CH_KEY_STAT(a5)        * keyon=$01 keyoff=$80 non=$00
  12.         bmi        AtoP_low_keyoff
  13.         bne        AtoP_low_keyon
  14.  
  15. *        通常の処理
  16.         move.w        CH_LAST_PCM(a5),d0    * d0.w = 前回変換終了時のPCM値
  17.         move.w        CH_AtoP_Y(a5),d1    * d1.w = PCM予測値
  18.         move.b        CH_ODDEVEN(a5),d2    * d2.b = ODD/EVEN FLAG
  19.         move.w        CH_PITCH_CTR(a5),d4    * d4.w = 音程カウンタ
  20.         movea.l        CH_PCM_ADR(a5),a0    * a0.l = ADPCMアドレス
  21.         movea.l        CH_AtoP_X(a5),a2    * a2.l = ADPCM->PCM変換テーブルアドレス
  22.         movea.l        CH_TRAP_ADR(a5),a3    * a3.l = 変換中のトラップアドレス
  23.         movea.l        CH_TRAP_ROUTINE(a5),a4    * a4.l = トラップ時の処理ルーチン
  24.  
  25.         movea.l        CH_JMP_ADR2(a5),a6
  26.         jmp        (a6)
  27.  
  28. *        キーオンの処理
  29. AtoP_low_keyon:
  30.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  31.  
  32.         moveq.l        #0,d0            * d0.w = 前回変換終了時のPCM値
  33.         moveq.l        #0,d1            * d1.w = PCM予測値
  34.         moveq.l        #-1,d2            * d2.b = ODD/EVEN FLAG リセット
  35.         move.w        d3,d4            * d4.w = 音程カウンタ
  36.         neg.w        d4            * d4.w =-増分(1回目でPCM変換するため)
  37.         movea.l        CH_TOP_ADR(a5),a0    * a0.l = ADPCM先頭アドレス
  38.         movea.l        #AtoP_tbl,a2        * a2.l = 変換テーブル
  39.  
  40.         move.l        CH_LPTIME(a5),d7    * ループ処理をするか
  41.         moveq.l        #1,d6
  42.         cmp.l        d6,d7            * cmpi.l より4clk速い
  43.         beq        1f
  44.         move.l        d7,CH_LPTIME_CTR(a5)    * ループ回数カウンタ初期化
  45.         movea.l        CH_LPSTART_ADR(a5),a3    * a3.l = ループスタートアドレス
  46.         lea.l        AtoP_LOOP,a4        * a4.l = ループスタート処理アドレス
  47.         move.l        a3,CH_TRAP_ADR(a5)
  48.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  49.  
  50.         movea.l        CH_JMP_ADR2(a5),a6
  51.         jmp        (a6)
  52.  
  53. 1:        movea.l        CH_END_ADR(a5),a3    * a3.l = ADPCMデータ終了アドレス
  54.         lea.l        AtoP_END,a4        * a4.l = データ終了処理アドレス
  55.         move.l        a3,CH_TRAP_ADR(a5)
  56.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  57.  
  58.         movea.l        CH_JMP_ADR2(a5),a6
  59.         jmp        (a6)
  60.  
  61. *        キーオフの処理
  62. AtoP_low_keyoff:
  63.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  64.         clr.b        CH_PLAY_FLAG(a5)    * 演奏終了
  65.         jmp        make_keyoff_PCM        * 消音PCM展開
  66.  
  67. *=======================================================
  68.  
  69. AtoP_low_mac    macro        _vol
  70.  
  71.         move.w        d3,a6
  72.  
  73.         move.l        CH_TPCNST(a5),d6
  74.         add.l        a0,d6
  75.         cmp.l        a3,d6
  76.         bcs        @f            * トラップ判定無しへ
  77.  
  78.         moveq.l        #MIX_SIZE*2-1,d3    * ADPCM -> PCM 変換
  79.  
  80. 4:        add.w        a6,d4            * 音程カウンタ += 音程
  81.         bcc        3f
  82.         neg.b        d2
  83.         bmi        2f
  84.         cmpa.l        a3,a0            * トラップにかかった?
  85.         bcs        1f
  86.         jsr        (a4)            * トラップ処理
  87. 1:        moveq.l        #0,d0            * (4)
  88.         move.b        (a0)+,d0        * (8)
  89.         add.w        d0,d0            * (4)
  90.         adda.w        d0,a2            * (8)
  91.         add.w        (a2),d1            * (8)
  92.         move.w        d1,d0            * (4)
  93.         add.w        256*2(a2),d1        * (12)
  94.         adda.w        256*2*2(a2),a2        * (16)
  95.         bra        3f
  96. 2:        move.w        d1,d0
  97. 3:    .if    _vol=8
  98.         add.w        d0,(a1)+
  99.     .else
  100.         move.w        d0,d7
  101.         VOLUME        _vol,d7,d6
  102.         add.w        d7,(a1)+
  103.     .endif
  104.         dbra        d3,4b
  105.  
  106.         move.w        d0,CH_LAST_PCM(a5)    * d0.w = 前回変換終了時のPCM値
  107.     .if    _vol=8
  108.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  109.     .else
  110.         move.w        d7,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  111.     .endif
  112.         move.w        d1,CH_AtoP_Y(a5)    * d1.w = PCM予測値
  113.         move.b        d2,CH_ODDEVEN(a5)    * d2.b = ODD/EVEN FLAG
  114.         move.w        d4,CH_PITCH_CTR(a5)    * d4.w = 音程カウンタ
  115.         move.l        a0,CH_PCM_ADR(a5)    * a0.l = ADPCMアドレス
  116.         move.l        a2,CH_AtoP_X(a5)    * a2.l = ADPCM->PCM変換テーブルアドレス
  117.  
  118.         rts
  119.  
  120. @@:
  121.         moveq.l        #MIX_SIZE*2-1,d3    * ADPCM -> PCM 変換
  122.  
  123. 4:        add.w        a6,d4            * 音程カウンタ += 音程
  124.         bcc        3f
  125.         neg.b        d2
  126.         bmi        2f
  127.         moveq.l        #0,d0            * (4)
  128.         move.b        (a0)+,d0        * (8)
  129.         add.w        d0,d0            * (4)
  130.         adda.w        d0,a2            * (8)
  131.         add.w        (a2),d1            * (8)
  132.         move.w        d1,d0            * (4)
  133.         add.w        256*2(a2),d1        * (12)
  134.         adda.w        256*2*2(a2),a2        * (16)
  135.         bra        3f
  136. 2:        move.w        d1,d0
  137. 3:    .if    _vol=8
  138.         add.w        d0,(a1)+
  139.     .else
  140.         move.w        d0,d7
  141.         VOLUME        _vol,d7,d6
  142.         add.w        d7,(a1)+
  143.     .endif
  144.         dbra        d3,4b
  145.  
  146.         move.w        d0,CH_LAST_PCM(a5)    * d0.w = 前回変換終了時のPCM値
  147.     .if    _vol=8
  148.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  149.     .else
  150.         move.w        d7,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  151.     .endif
  152.         move.w        d1,CH_AtoP_Y(a5)    * d1.w = PCM予測値
  153.         move.b        d2,CH_ODDEVEN(a5)    * d2.b = ODD/EVEN FLAG
  154.         move.w        d4,CH_PITCH_CTR(a5)    * d4.w = 音程カウンタ
  155.         move.l        a0,CH_PCM_ADR(a5)    * a0.l = ADPCMアドレス
  156.         move.l        a2,CH_AtoP_X(a5)    * a2.l = ADPCM->PCM変換テーブルアドレス
  157.  
  158.         rts
  159.  
  160.         endm
  161.  
  162. *=======================================================
  163.  
  164. AtoP_low_v00:    AtoP_low_mac    0
  165. AtoP_low_v01:    AtoP_low_mac    1
  166. AtoP_low_v02:    AtoP_low_mac    2
  167. AtoP_low_v03:    AtoP_low_mac    3
  168. AtoP_low_v04:    AtoP_low_mac    4
  169. AtoP_low_v05:    AtoP_low_mac    5
  170. AtoP_low_v06:    AtoP_low_mac    6
  171. AtoP_low_v07:    AtoP_low_mac    7
  172. AtoP_low_v08:    AtoP_low_mac    8
  173. AtoP_low_v09:    AtoP_low_mac    9
  174. AtoP_low_v10:    AtoP_low_mac    10
  175. AtoP_low_v11:    AtoP_low_mac    11
  176. AtoP_low_v12:    AtoP_low_mac    12
  177. AtoP_low_v13:    AtoP_low_mac    13
  178. AtoP_low_v14:    AtoP_low_mac    14
  179. AtoP_low_v15:    AtoP_low_mac    15
  180. AtoP_low_vnn:    AtoP_low_mac    'n'
  181. AtoP_low_non:    AtoP_low_mac    'x'
  182.  
  183.